package E_A.org.tinos.deta.hooks.main;

import S_A.pheromone.IMV_SQI;

import java.util.List;
import java.util.Map;
import java.util.concurrent.CopyOnWriteArrayList;

/*
 * 个人著作权人, 作者 罗瑶光, 浏阳
 * yaoguangluo@outlook.com, 313699483@qq.com, 2080315360@qq.com,
 * (lyg.tin@gmail.com2018年回国后因国内G网屏蔽不再使用）
 * 15116110525-浏阳德塔软件开发有限公司-创始人-法人-总经理-永久非盈利-
 * 430181198505250014, G24402609, EB0581342
 * 204925063, 389418686, F2406501, 0626136
 * 湖南省 浏阳市 集里街道 神仙坳社区 大塘冲一段路 208号 阳光家园别墅小区 第十栋别墅 第三层
 * */
//时间: 20220623
//描述: 这个函数主要用于Exception的传入进行登记. 通过序列号区分, 时间记录,
//文件记录和异常描述的4个维度进行异常登记。
//输出结果如下, 注意下 间隔符号为‘：’
//归纳序列号：时间：文件名：异常描述
//稍后处理异常循环准备用map, 避免内存递增。
public class Hook_E extends Throwable implements Hook_C {

    public List<String> exceptionList = new CopyOnWriteArrayList<>();
    //处理异常循环准备用map, 避免内存递增。
    public Map<String, ExceptInformation> exceptionMap = new IMV_SQI();

    //这个函数用于异常描述
    public String getCurrentEnvironment(String session) {
        String CurrentEnvironment = new String(session + ":");//序列号
        CurrentEnvironment += System.currentTimeMillis() + ":";//时间
        return CurrentEnvironment;
    }

    public String getCurrentFrequentEnvironment(String session, String timeMillis) {
        String CurrentEnvironment = new String(session + ":");//序列号
        CurrentEnvironment += timeMillis + ":";//时间
        return CurrentEnvironment;
    }

    public String getCurrentFrequentEnvironment(String session, Long timeMillis) {
        String CurrentEnvironment = new String(session + ":");//序列号
        CurrentEnvironment += timeMillis.toString() + ":";//时间
        return CurrentEnvironment;
    }

    //用于登记异常
    public void hookException(Exception exception) {
        String session = "" + Math.random();
        exceptionList.add(getCurrentEnvironment(session) + exception.toString());
        StackTraceElement[] stackTraceElements = exception.getStackTrace();
        for (StackTraceElement stackTraceElement : stackTraceElements) {
            exceptionList.add(getCurrentEnvironment(session) + stackTraceElement.toString());
        }
    }

    //用于显示异常
    @SuppressWarnings("unused")
    public void showException(Exception exception) {
        //20230106-S_logger.Log.logger.info("" + exception.toString());
        StackTraceElement[] stackTraceElements = exception.getStackTrace();
        for (StackTraceElement stackTraceElement : stackTraceElements) {
            //20230106-S_logger.Log.logger.info("" + stackTraceElement.toString());
        }
    }

    //这里出现一个问题, 便是session的随机循环异常无法有效的命名,
    //于是准备将session提取出来到接口外定义, 这样map价值就出来了。于是内容为捕捉的times记录。
    public void hookFrequentException(String uniqueSessionKey, Long timeMillis
        , Exception exception) {
        //如果出现同session 不同内容异常, 不讨论, 在函数上层进行区分。
        if (exceptionMap.containsKey(uniqueSessionKey)) {
            //map计数递增
            ExceptInformation exceptInformation = exceptionMap.get(uniqueSessionKey);
            exceptInformation.exceptionCount += 1;
            exceptInformation.exceptionTimes.add(timeMillis);
            exceptionMap.put(uniqueSessionKey, exceptInformation);
            return;
        }
        //map登记录入
        ExceptInformation exceptInformation = new ExceptInformation();
        exceptInformation.exceptionCount = 1;
        exceptInformation.exceptionSession = uniqueSessionKey;
        exceptInformation.exceptionTimes.add(timeMillis);
        exceptInformation.putException(exception);
        exceptionMap.put(uniqueSessionKey, exceptInformation);
        //list 同步登记
        exceptionList.add(getCurrentFrequentEnvironment(uniqueSessionKey, timeMillis)
            + exception.toString());
        StackTraceElement[] stackTraceElements = exception.getStackTrace();
        for (StackTraceElement stackTraceElement : stackTraceElements) {
            exceptionList.add(getCurrentFrequentEnvironment(uniqueSessionKey, timeMillis)
                + stackTraceElement.toString());
        }
    }

    //这个函数用于异常描述
    public void hookThrowable(Throwable throwable) {
        String session = "" + Math.random();
        exceptionList.add(getCurrentEnvironment(session) + throwable.toString());
        ////20230106-S_logger.Log.logger.info("" + new Hook().getCurrentEnvironment()+ throwable.toString());
        StackTraceElement[] stackTraceElements = throwable.getStackTrace();
        for (StackTraceElement stackTraceElement : stackTraceElements) {
            exceptionList.add(getCurrentEnvironment(session) + stackTraceElement.toString());
        }
    }

    public void hookThrowable(String throwableString) {
        String session = "" + Math.random();
        exceptionList.add(getCurrentEnvironment(session) + throwableString);
    }

    public void hookSleeper(Object object) {

    }
}